﻿using System;
using System.Collections.Generic;
using System.Linq;
using PSE.Tools.Util.Entidades;

using System.IO;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;


namespace PSE.Tools.CadastroMensagens.Negocio
{
    /// <summary>
    ///  Classe que persiste as informações de Módulo
    /// </summary>
    public class Modulo
    {
        #region [ Variáveis ]

        AcessoDados.Modulo _modulosNegocio;


        #endregion [ Variáveis ]

        #region [ Contrutores ]

        public Modulo()
        {
            _modulosNegocio = new AcessoDados.Modulo();
        }

        #endregion [ Contrutores ]

        #region [ Métodos ]

        /// <summary>
        /// Retorna uma lista Contendo os Módulos Existentes
        /// </summary>
        public IList<Entidades.Modulo> ListarModulo()
        {
            return _modulosNegocio.ListarModulo();
        }

        public void GeradorXmlModuloSubModulo(string caminho)
        {

            //caminho de gravação do arquivo XML
            //string caminho = Environment.CurrentDirectory.ToString();

            //arquivo xml
            string arquivo = "ModuloSubModulo.xml";

            //caminho completo
            caminho = caminho + "Suporte\\" + arquivo;


            if (File.Exists(caminho))
            {
                if (DataCriacaoArquivoXML(caminho) != DateTime.Today.ToString("dd/MM/yyyy"))
                {
                    GerarArquivo(caminho);
                }
            }
            else { GerarArquivo(caminho); }
        }

        public void GerarArquivo(string caminho)
        {
            //criação dos objetos de negocio
            AcessoDados.Modulo modulo = new PSE.Tools.CadastroMensagens.AcessoDados.Modulo();
            AcessoDados.SubModulo subModulo = new PSE.Tools.CadastroMensagens.AcessoDados.SubModulo();

            //carregamento de dados para as listas
            List<Entidades.Modulo> moduloLista = (List<Entidades.Modulo>)modulo.ListarModulo();
            List<Entidades.SubModulo> subModuloLista = (List<Entidades.SubModulo>)subModulo.ListarSubModuloPorModulo(0);

            XElement documentoXml = new XElement("Modulos");
            XElement moduloNode = null;
            XElement subModuloNode = null;
            XElement dataAtualizacao = new XElement("dataAtualizacao");
            dataAtualizacao.SetElementValue("data", DateTime.Today.ToString("dd/MM/yyyy"));

            documentoXml.Add(dataAtualizacao);
            foreach (Entidades.Modulo item in moduloLista)
            {
                moduloNode = new XElement("Modulo");

                //Nodes  
                moduloNode.SetElementValue("idModulo", item.Id);
                moduloNode.SetElementValue("nomeModulo", item.Nome);


                var m = from s in subModuloLista where s.fkModulo == item.Id select s;
                foreach (Entidades.SubModulo subItem in m)
                {
                    subModuloNode = new XElement("SubModulo");

                    //Nodes  
                    subModuloNode.SetElementValue("idSubModulo", subItem.Id);
                    subModuloNode.SetElementValue("nomeSubModulo", subItem.Nome);
                    moduloNode.Add(subModuloNode);
                }

                //Adiciona elemento ao elemento root   
                documentoXml.Add(moduloNode);
            }
            documentoXml.Save(caminho);

        }
        public string DataCriacaoArquivoXML(string caminho)
        {

            XmlTextReader reader = new XmlTextReader(caminho);
            XmlDocument xml = new XmlDocument();
            xml.Load(reader);

            string retorno = "";
            retorno = (xml.SelectSingleNode("//data")).InnerText.ToString();

            reader.Close();
            return retorno;
        }
        #endregion [ Métodos ]
    }
}